//
// Created by ROG on 2024/10/10.
//
#include <stdio.h>
#include <stdbool.h>

#define MAX_TERMS 100  // 最大多项式项数

// 定义多项式项结构
typedef struct {
    int coef;   // 系数
    int exp;    // 指数
} Term;

// 定义多项式的静态顺序表结构
typedef struct {
    Term terms[MAX_TERMS];  // 固定大小的数组存储多项式项
    int length;             // 多项式的当前项数
} Polynomial;

// 初始化多项式
void InitPolynomial(Polynomial *P) {
    P->length = 0;  // 初始时多项式项数为0
}

// 插入多项式项（按指数降序排列）
bool InsertTerm(Polynomial *P, int coef, int exp) {
    if (P->length >= MAX_TERMS) {  // 空间已满，无法插入
        printf("多项式项数已达到上限，无法插入新项。\n");
        return false;
    }

    int i;
    // 找到正确的插入位置，使多项式按指数降序排列
    for (i = P->length - 1; i >= 0 && P->terms[i].exp < exp; i--) {
        P->terms[i + 1] = P->terms[i];  // 后移项
    }

    // 如果指数相同，则合并系数
    if (i >= 0 && P->terms[i].exp == exp) {
        P->terms[i].coef += coef;
        if (P->terms[i].coef == 0) {
            // 如果合并后的系数为0，删除该项
            for (int j = i; j < P->length - 1; j++) {
                P->terms[j] = P->terms[j + 1];
            }
            P->length--;
        }
    } else {
        // 插入新项
        P->terms[i + 1].coef = coef;
        P->terms[i + 1].exp = exp;
        P->length++;
    }

    return true;
}

// 删除多项式中的某一项（根据指数）
bool DeleteTerm(Polynomial *P, int exp) {
    int i;
    // 查找具有该指数的项
    for (i = 0; i < P->length; i++) {
        if (P->terms[i].exp == exp) {
            break;
        }
    }

    if (i == P->length) {
        // 没有找到对应的项
        printf("未找到指数为 %d 的项。\n", exp);
        return false;
    }

    // 删除该项
    for (int j = i; j < P->length - 1; j++) {
        P->terms[j] = P->terms[j + 1];
    }
    P->length--;
    return true;
}

// 显示多项式
void DisplayPolynomial(Polynomial P) {
    if (P.length == 0) {
        printf("多项式为空。\n");
        return;
    }

    for (int i = 0; i < P.length; i++) {
        if (P.terms[i].coef == 0) continue;  // 系数为0的项不显示
        if (i > 0 && P.terms[i].coef > 0) {
            printf("+");  // 正系数前加 "+"
        }
        if (P.terms[i].exp == 0) {
            printf("%d", P.terms[i].coef);  // 常数项
        } else if (P.terms[i].exp == 1) {
            printf("%dx", P.terms[i].coef);  // x^1 项
        } else {
            printf("%dx^%d", P.terms[i].coef, P.terms[i].exp);  // 一般项
        }
    }
    printf("\n");
}

// 清空多项式
void ClearPolynomial(Polynomial *P) {
    P->length = 0;  // 直接将多项式长度置0
}

// 删除多项式，静态分配无需释放内存
void DestroyPolynomial(Polynomial *P) {
    P->length = 0;  // 将长度置0相当于销毁
    printf("多项式已销毁。\n");
}

int main() {
    Polynomial P;
    InitPolynomial(&P);

    // 插入多项式项
    InsertTerm(&P, 3, 5);  // 3x^5
    InsertTerm(&P, 2, 3);  // 2x^3
    InsertTerm(&P, -1, 2); // -x^2
    InsertTerm(&P, 6, 0);  // 6

    // 显示多项式
    printf("当前多项式: ");
    DisplayPolynomial(P);

    // 删除指数为3的项
    DeleteTerm(&P, 3);
    printf("删除指数为3的项后: ");
    DisplayPolynomial(P);

    // 清空多项式
    ClearPolynomial(&P);
    printf("清空后的多项式: ");
    DisplayPolynomial(P);

    // 销毁多项式
    DestroyPolynomial(&P);

    return 0;
}
